#include <stdio.h> // 头文件的路径/usr/include/
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <linux/input.h> //触摸屏的头文件 /usr/include/linux/input.h

// 滑动的状态
enum SLIDE
{
    LEFT,
    RIGHT,
    UP,
    DOWN,
    CLICK
};

// 获取点击的坐标值
int get_ts_xy(int *x, int *y)
{
    // 打开触摸屏
    int fd_ts = open("/dev/input/event0", O_RDWR);
    if (fd_ts < 0)
    {
        printf("open ts fail\n");
        return -1;
    }

    // 读触摸屏信息
    struct input_event ts; // 存储触摸屏信息的结构体
    while (1)
    {
        // 清空存储区
        memset(&ts, 0, sizeof(struct input_event));

        // 当触摸屏没有点击的时候它会阻塞在这个地方
        read(fd_ts, &ts, sizeof(struct input_event));

        // x轴坐标值
        if (ts.type == EV_ABS && ts.code == ABS_X)
        {
            // printf("x = %d ", ts.value); // 蓝色触摸屏
            // printf("x = %d ", (int)(ts.value * 0.78)); // 1024-->800 黑色
            // printf("x = %d ", ts.value * 800 / 1024); // 黑色触摸屏
            *x = ts.value;
            // *x =  ts.value * 800 / 1024;
        }
        // y轴坐标值
        if (ts.type == EV_ABS && ts.code == ABS_Y)
        {
            // printf("y = %d\n", ts.value); // 蓝色触摸屏
            // printf("y = %d \n", ts.value * 480 / 600); // 黑色触摸屏600-->480
            *y = ts.value;
            // *y = ts.value * 480 / 600;
        }

        /*
            开发者下面的两组坐标值二选一
        */
        // 获取按下去的值
        if (ts.type == EV_KEY && ts.code == BTN_TOUCH && ts.value == 1)
        {
            // printf("down x=%d y=%d\n", x, y); //调试代码
            break;
        }
        // 获取松手后的值
        // if (ts.type == EV_KEY && ts.code == BTN_TOUCH && ts.value == 0)
        // {
        //     printf("up x=%d y=%d\n", x, y);
        // }
    }

    // 关闭文件
    close(fd_ts);
}

// 划屏算法
int get_ts_slide()
{
    // 打开触摸屏
    int fd_ts = open("/dev/input/event0", O_RDWR);
    if (fd_ts < 0)
    {
        printf("open ts fail\n");
        return -1;
    }

    // 读触摸屏信息
    struct input_event ts; // 存储触摸屏信息的结构体
    int x1 = 0, y1 = 0;    // 按下去坐标值(x1,y1)
    int x2 = 0, y2 = 0;    // 松手后的坐标值(x2,y2)
    while (1)
    {
        // 获取按下去的值
        while (1)
        {
            // 清空存储区
            memset(&ts, 0, sizeof(struct input_event));

            // 当触摸屏没有点击的时候它会阻塞在这个地方
            read(fd_ts, &ts, sizeof(struct input_event));

            // x轴坐标值
            if (ts.type == EV_ABS && ts.code == ABS_X)
            {
                // printf("x = %d ", ts.value); // 蓝色触摸屏
                // printf("x = %d ", (int)(ts.value * 0.78)); // 1024-->800 黑色
                // printf("x = %d ", ts.value * 800 / 1024); // 黑色触摸屏
                x1 = ts.value;
                // x =  ts.value * 800 / 1024;
            }
            // y轴坐标值
            if (ts.type == EV_ABS && ts.code == ABS_Y)
            {
                // printf("y = %d\n", ts.value); // 蓝色触摸屏
                // printf("y = %d \n", ts.value * 480 / 600); // 黑色触摸屏600-->480
                y1 = ts.value;
                // y = ts.value * 480 / 600;
            }

            // 获取按下去的值
            if (ts.type == EV_KEY && ts.code == BTN_TOUCH && ts.value == 1)
            {
                // printf("down x1=%d y1=%d\n", x1, y1);
                break;
            }
        }

        // 获取松手后的值
        while (1)
        {
            // 清空存储区
            memset(&ts, 0, sizeof(struct input_event));

            // 当触摸屏没有点击的时候它会阻塞在这个地方
            read(fd_ts, &ts, sizeof(struct input_event));

            // x轴坐标值
            if (ts.type == EV_ABS && ts.code == ABS_X)
            {
                // printf("x = %d ", ts.value); // 蓝色触摸屏
                // printf("x = %d ", (int)(ts.value * 0.78)); // 1024-->800 黑色
                // printf("x = %d ", ts.value * 800 / 1024); // 黑色触摸屏
                x2 = ts.value;
                // x =  ts.value * 800 / 1024;
            }
            // y轴坐标值
            if (ts.type == EV_ABS && ts.code == ABS_Y)
            {
                // printf("y = %d\n", ts.value); // 蓝色触摸屏
                // printf("y = %d \n", ts.value * 480 / 600); // 黑色触摸屏600-->480
                y2 = ts.value;
                // y = ts.value * 480 / 600;
            }

            // 获取松手后的值
            if (ts.type == EV_KEY && ts.code == BTN_TOUCH && ts.value == 0)
            {
                // printf("up x2=%d y2=%d\n", x2, y2);
                break;
            }
        }

        if (x2 - x1 > 50)
            return RIGHT;
        if (x2 - x1 < -50)
            return LEFT;
        if (y2 - y1 > 50)
            return DOWN;
        if (y2 - y1 < -50)
            return UP;
    }
    // 关闭文件
    close(fd_ts);

    return 0;
}

// 点击+滑动
int get_click_slide(int *x, int *y)
{
    // 打开触摸屏
    int fd_ts = open("/dev/input/event0", O_RDWR);
    if (fd_ts < 0)
    {
        printf("open ts fail\n");
        return -1;
    }

    // 读触摸屏信息
    struct input_event ts; // 存储触摸屏信息的结构体
    int x1 = 0, y1 = 0;    // 按下去坐标值(x1,y1)
    int x2 = 0, y2 = 0;    // 松手后的坐标值(x2,y2)
    while (1)
    {
        // 获取按下去的值
        while (1)
        {
            // 清空存储区
            memset(&ts, 0, sizeof(struct input_event));

            // 当触摸屏没有点击的时候它会阻塞在这个地方
            read(fd_ts, &ts, sizeof(struct input_event));

            // x轴坐标值
            if (ts.type == EV_ABS && ts.code == ABS_X)
            {
                // printf("x = %d ", ts.value); // 蓝色触摸屏
                // printf("x = %d ", (int)(ts.value * 0.78)); // 1024-->800 黑色
                // printf("x = %d ", ts.value * 800 / 1024); // 黑色触摸屏
                x1 = ts.value;
                // x =  ts.value * 800 / 1024;

                *x = x1; // 获取点击的坐标
            }
            // y轴坐标值
            if (ts.type == EV_ABS && ts.code == ABS_Y)
            {
                // printf("y = %d\n", ts.value); // 蓝色触摸屏
                // printf("y = %d \n", ts.value * 480 / 600); // 黑色触摸屏600-->480
                y1 = ts.value;
                // y = ts.value * 480 / 600;

                *y = y1; // 获取点击的坐标
            }

            // 获取按下去的值
            if (ts.type == EV_KEY && ts.code == BTN_TOUCH && ts.value == 1)
            {
                printf("down x1=%d y1=%d\n", x1, y1);
                break;
            }
        }

        // 获取松手后的值
        while (1)
        {
            // 清空存储区
            memset(&ts, 0, sizeof(struct input_event));

            // 当触摸屏没有点击的时候它会阻塞在这个地方
            read(fd_ts, &ts, sizeof(struct input_event));

            // x轴坐标值
            if (ts.type == EV_ABS && ts.code == ABS_X)
            {
                // printf("x = %d ", ts.value); // 蓝色触摸屏
                // printf("x = %d ", (int)(ts.value * 0.78)); // 1024-->800 黑色
                // printf("x = %d ", ts.value * 800 / 1024); // 黑色触摸屏
                x2 = ts.value;
                // x =  ts.value * 800 / 1024;
            }
            // y轴坐标值
            if (ts.type == EV_ABS && ts.code == ABS_Y)
            {
                // printf("y = %d\n", ts.value); // 蓝色触摸屏
                // printf("y = %d \n", ts.value * 480 / 600); // 黑色触摸屏600-->480
                y2 = ts.value;
                // y = ts.value * 480 / 600;
            }

            // 获取松手后的值
            if (ts.type == EV_KEY && ts.code == BTN_TOUCH && ts.value == 0)
            {
                printf("up x2=%d y2=%d\n", x2, y2);
                break;
            }
        }

        if (x2 != 0) // 滑动
        {
            if (x2 - x1 > 50)
                return RIGHT;
            if (x2 - x1 < -50)
                return LEFT;
            if (y2 - y1 > 50)
                return DOWN;
            if (y2 - y1 < -50)
                return UP;
        }
        else // 点击
            return CLICK;

        // 清空坐标值
        x1 = x2 = 0;
        y1 = y2 = 0;
    }

    // 关闭文件
    close(fd_ts);

    return 0;
}

int main(int argc, char **argv)
{
    int x = 0, y = 0;

#if 0 // 点击
    while (1)
    {
        // 获取x和y轴的坐标值
        get_ts_xy(&x, &y);
        printf("x=%d y=%d\n", x, y);

        if (x < 400)
            printf("left\n");

        if (x > 400)
            printf("right\n");
    }
#endif

#if 0 // 滑动
    while (1)
    {
        switch (get_ts_slide())
        {
        case LEFT:
            printf("left\n");
            break;
        case RIGHT:
            printf("right\n");
            break;
        case UP:
            printf("up\n");
            break;
        case DOWN:
            printf("down\n");
            break;
        default:
            break;
        }
    }
#endif

#if 1 // 点击+滑动
    while (1)
    {
        int x = 0, y = 0;
        switch (get_click_slide(&x, &y))
        {
        case LEFT:
            printf("left\n");
            break;
        case RIGHT:
            printf("right\n");
            break;
        case UP:
            printf("up\n");
            break;
        case DOWN:
            printf("down\n");
            break;
        case CLICK:
            printf("click x=%d y=%d\n", x, y);
            break;
        default:
            break;
        }
    }
#endif

    return 0;
}